package com.itheima.recommend.pojo;

import java.io.Serializable;
import java.util.*;

/**
 * 猜你喜欢 图
 */
public class Graph_product implements Serializable {

    private ArrayList<VexNode> roots;//顶点数组

    public Graph_product() {
        this.roots = new ArrayList<VexNode>();
    }

    public Graph_product(int v) {
        this.roots = new ArrayList<VexNode>(v);
    }

    public int addRoot(String v1) {
        //设置顶点信息
        VexNode vexNode = new VexNode();
        vexNode.val = v1;
        roots.add(vexNode);
        System.out.println("添加顶点成功: " + v1);
        return roots.size() - 1;
    }

    /**
     * 添加边
     */
    public void addEdge(int v, int w) {

        //没有就add 有就++
        Node newNodeV = new Node();
        newNodeV.index = v;
        newNodeV.count = 1;
        Node newNodeW = new Node();
        newNodeW.index = w;
        newNodeW.count = 1;
        if (roots.get(v).firstarc.size() == 0) {
            roots.get(v).firstarc.add(newNodeW);
        } else {

            //查看存不存在
            Node node = existEdge(v, w);
            if (node == null) {
                //不存在添加
                roots.get(v).firstarc.add(newNodeW);
            } else {
                //存在++
                node.count = node.count + 1;
            }

        }
        if (roots.get(w).firstarc.size() == 0) {
            roots.get(w).firstarc.add(newNodeV);

        } else {
            //查看存不存在
            Node node2 = existEdge(w, v);
            if (node2 == null) {
                //不存在添加
                roots.get(w).firstarc.add(newNodeV);
            } else {
                //存在++
                node2.count = node2.count + 1;
            }
        }


    }

    /**
     * v 中 存不存在w的边
     */
    private Node existEdge(int v, int w) {
        for (Node node : adj(v)) {
            if (node.index == w) {
                return node;
            }
        }
        return null;
    }

    //返回该顶点下的邻边 的 Node
    public Iterable<Node> adj(int v) {
        return roots.get(v).firstarc;
    }

    /**
     * 根据名字 返回邻边 顶点的
     */
    public Iterable<Node> adj(String name) {
        for (int i = 0; i < roots.size(); i++) {
            if (name.equals(roots.get(i).val)) {
                return adj(i);
            }
        }
        return null;
    }

    /**
     * 根据顶点index 取出 商品名
     *
     * @param i
     * @return
     */
    public String index(int i) {
        return roots.get(i).val;
    }

    /**
     * 根据顶点name 取出 index
     */
    public int index(String name) {
        for (int i = 0; i < roots.size(); i++) {
            if (roots.get(i).val.equals(name)) {
                return i;
            }
        }
        return addRoot(name);

    }
}
